1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  package com.google.common.collect;
18  
19  import com.google.common.annotations.GwtCompatible;
20  
21  import java.io.Serializable;
22  import java.util.Collection;
23  import java.util.EnumSet;
24  
25  
26  
27  
28  
29  
30  
31  @GwtCompatible(serializable = true, emulated = true)
32  @SuppressWarnings("serial") 
33  final class ImmutableEnumSet<E extends Enum<E>> extends ImmutableSet<E> {
34    static <E extends Enum<E>> ImmutableSet<E> asImmutable(EnumSet<E> set) {
35      switch (set.size()) {
36        case 0:
37          return ImmutableSet.of();
38        case 1:
39          return ImmutableSet.of(Iterables.getOnlyElement(set));
40        default:
41          return new ImmutableEnumSet<E>(set);
42      }
43    }
44  
45    
46  
47  
48  
49  
50  
51  
52  
53    private final transient EnumSet<E> delegate;
54  
55    private ImmutableEnumSet(EnumSet<E> delegate) {
56      this.delegate = delegate;
57    }
58  
59    @Override boolean isPartialView() {
60      return false;
61    }
62  
63    @Override public UnmodifiableIterator<E> iterator() {
64      return Iterators.unmodifiableIterator(delegate.iterator());
65    }
66  
67    @Override
68    public int size() {
69      return delegate.size();
70    }
71  
72    @Override public boolean contains(Object object) {
73      return delegate.contains(object);
74    }
75  
76    @Override public boolean containsAll(Collection<?> collection) {
77      return delegate.containsAll(collection);
78    }
79  
80    @Override public boolean isEmpty() {
81      return delegate.isEmpty();
82    }
83  
84    @Override public boolean equals(Object object) {
85      return object == this || delegate.equals(object);
86    }
87  
88    private transient int hashCode;
89  
90    @Override public int hashCode() {
91      int result = hashCode;
92      return (result == 0) ? hashCode = delegate.hashCode() : result;
93    }
94  
95    @Override public String toString() {
96      return delegate.toString();
97    }
98  
99    
100   @Override Object writeReplace() {
101     return new EnumSerializedForm<E>(delegate);
102   }
103 
104   
105 
106 
107   private static class EnumSerializedForm<E extends Enum<E>>
108       implements Serializable {
109     final EnumSet<E> delegate;
110     EnumSerializedForm(EnumSet<E> delegate) {
111       this.delegate = delegate;
112     }
113     Object readResolve() {
114       
115       return new ImmutableEnumSet<E>(delegate.clone());
116     }
117     private static final long serialVersionUID = 0;
118   }
119 }